function interp_data = fir_interpolate(audio_data, interp_factor,fir_osr,fir_type,param_cfg)

    fixed_point_cfg = param_cfg.fixed_point_cfg;
    Fs = param_cfg.raw_data_cfg.raw_fs;
    pn = length(audio_data);
%     if(pn ~= 2^6 && pn ~= 2^10 && pn ~= 2^13 && pn ~= 2^14 && pn ~= 2^15 && pn ~= 2^16 && pn ~= 2^17 && pn ~= 2^18 && pn ~= 2^19&& pn ~= 2^20&& pn ~= 2^21&& pn ~= 2^22&& pn ~= 2^23&& pn ~= 2^24)
%         error("传入的原始数据长度必须是2^N");
%     end
    if(param_cfg.debug.intp_input_raw_data == "enable")
        fft_plot_tittle=sprintf("插值单元输入数据");
        plotCustomSpectrum_method2(audio_data,Fs,1,"custom",fft_plot_tittle); %% 对原始数据进行FFT之前进行了截取,以避免频谱泄露
    end
%% OSR 设置
    fft_osr = interp_factor;

%% Kaiser窗FIR滤波器设计
    fc = 24000;             % 截止频率20kHz
    tband = 80000;          % 过渡带宽50kHz
    % beta = 14.26526;        % Kaiser窗形状参数
    beta = fixed_point_calculation_vector(14.26526, 1, 'mul' , fixed_point_cfg.Int_num , fixed_point_cfg.Fixed_num,fixed_point_cfg.DataType);
    N=160;                   % 滤波器阶数
    % N = round(10*Fs*interp_factor/(2*tband));



%% 一段 fir 2倍过采样插值/滤波
if(fir_osr ~= 1)
    % 设计一段FIR滤波器参数
    if(fir_type == "fir")
        fir_h   = fir1(N, fc/(Fs*fir_osr/2), 'low', kaiser(N+1, beta));
    else
        fir_h   = fir1(N, fc/(Fs*fir_osr/2), 'low', boxcar(N+1));
    end
    fir_h = fixed_point_calculation_vector(fir_h, 1, 'mul' , fixed_point_cfg.Int_num , fixed_point_cfg.Fixed_num,fixed_point_cfg.DataType);
    fir_tmp = fir_h*2^23;
    % 分析频率响应
    figure();
    freqz(fir_h, 1, N, Fs*fir_osr);
    title(['Kaiser窗低通FIR: ', num2str(fc/1000), 'kHz截止, N=', num2str(N)]);

    fft_osr = fir_osr;

    %插值
    fir_inp_data = zeros(1, length(audio_data)*fir_osr);  % 插值后总长度
    for i=0 : (length(audio_data)-1)
        fir_inp_data(1+i*fir_osr) = audio_data(i+1);
    end
    if(param_cfg.debug.intp_insert_0_data=="enable")
        fft_plot_tittle=sprintf("0阶16倍增采样插值结果");
        plotCustomSpectrum_method2(fir_inp_data,Fs,fir_osr,"custom",fft_plot_tittle);%% 对数据进行FFT之前进行了截取,以避免频谱泄露
    end

    % FIR滤波
    fir_1th_y=filter(fir_h,1,fir_inp_data);
    fir_1th_y=fir_1th_y*(fir_osr);
    if(param_cfg.debug.intp_fir_out_data=="enable")
        fft_plot_tittle=sprintf("%s:fir滤波输出数据,OSR=%d\n",fir_type,fft_osr);
        plotCustomSpectrum_method2(fir_1th_y,Fs,fir_osr,"custom",fft_plot_tittle);%% 对数据进行FFT之前进行了截取,以避免频谱泄露
    end
end
%% 线性插值滤波器设计
    if(fir_osr ~= 1)
        line_input = fir_1th_y;
    else
        line_input = audio_data;
    end
    line_input = fixed_point_calculation_vector(line_input, 1, 'mul' , fixed_point_cfg.Int_num , fixed_point_cfg.Fixed_num,fixed_point_cfg.DataType);

    line_osr      = interp_factor / (fir_osr); % 过采样率
    fft_osr = fir_osr * line_osr;

    line_y = zeros(1,length(line_input)*line_osr);
    for i =1 :length(line_input)
        if(i<length(line_input))
            % add_step = (line_input(i+1) - line_input(i) ) / line_osr;
            add_step = fixed_point_calculation_vector((line_input(i+1) - line_input(i) ), line_osr, 'div' , fixed_point_cfg.Int_num , fixed_point_cfg.Fixed_num,fixed_point_cfg.DataType);
        end
        for j = 1 : line_osr
            if(j==1)
                line_y((i-1)*line_osr+j) = line_input(i);
            else
                line_y((i-1)*line_osr+j) = line_y((i-1)*line_osr+j-1) + add_step;
            end
        end
    end
    if(param_cfg.debug.intp_line_out_data=="enable")
        fft_plot_tittle=sprintf("%s%d:线性插值滤波器输出数据,OSR=%d\n",fir_type,fir_osr,fft_osr);
        plotCustomSpectrum_method2(line_y,Fs,fft_osr,"custom",fft_plot_tittle);%% 对数据进行FFT之前进行了截取,以避免频谱泄露
    end
    interp_data = line_y;
end
